#include <stdio.h> 
#include <stdlib.h>
#include <omp.h>

void socket_work(int socket_num, int n_thrds);

int main(void)
{
    int n_sockets, socket_num, n_thrds_on_socket;

    omp_set_nested(1); // 启用嵌套并行
    omp_set_max_active_levels(2); // 设置最大活动层级为 2

    // 在 Windows 上不使用 places，直接使用一个默认的线程数
    n_sockets = 1;  // 设置为1，因为 Windows 可能不支持 OpenMP 插槽特性
    n_thrds_on_socket = omp_get_num_procs();  // 使用系统的处理器数

    printf("系统共有 %d 个处理器\n", n_thrds_on_socket);

    // 使用 n_sockets 数量的线程进行 LEVEL 1 并行
    #pragma omp parallel num_threads(n_sockets) private(socket_num)
    {
        socket_num = 0;  // 我们只有一个插槽，所以直接使用 0 插槽

        if (socket_num == 0)
            printf("LEVEL 1 AFFINITIES: 每个插槽 1 个线程，共 %d 个插槽\n", n_sockets);

        omp_display_affinity(NULL);

        // 调用 LEVEL 2 的线程处理
        socket_work(socket_num, n_thrds_on_socket);
    }

    return 0;
}

void socket_work(int socket_num, int n_thrds)
{
    #pragma omp parallel num_threads(n_thrds)
    {
        if(omp_get_thread_num() == 0)
            printf("LEVEL 2 AFFINITIES: 每个插槽 %d 个线程，插槽 %d\n", n_thrds, socket_num);

        omp_display_affinity(NULL);
    }
}
